home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 02 (1989-02)(MicroSPARC)(Side A).zip / Nibble Volume 10, No. 02 (1989-02)(MicroSPARC)(Side A).po / TYPE.S < prev    next >
Text File  |  1996-12-24  |  16KB  |  480 lines

  1.  
  2. *****************************
  3. *   TYPE  Source Code       *
  4. *   by Bill Tudor           *
  5. *   COPYRIGHT (C) 1989      *
  6. *   BY MICROSPARC, INC.     *
  7. *   CONCORD, MA  01742      *
  8. *****************************
  9. *   Merlin 8/16
  10.  
  11. * Program/Monitor Equates:
  12.  
  13. PTR       = $06          ;pointer ($06,$07)
  14. PADDR     = $08          ;temp storage
  15. OFFSET    = $09          ;index variable
  16. COUNT     = $19          ;counter
  17. SIZE      = $FA          ;display size
  18. *
  19. HIMEM     = $73          ;system; HIMEM
  20. INBUF     = $200         ;system; keyboard input buffer
  21. KEYBD     = $C000        ;system; the keyboard
  22. STROBE    = $C010        ;system; reset keyboard strobe
  23. SPKR      = $C030        ;system; speaker click
  24. RD80COL   = $C01F        ;system; 80 col switch
  25. OPLEN     = $2F          ;monitor; opcode length
  26. A1L       = $3C          ;monitor; MOVE start
  27. A2L       = $3E          ;monitor; MOVE end
  28. A4L       = $42          ;monitor; MOVE destination
  29. CHKOPLEN  = $F88E        ;monitor; check opcode length
  30. PRTAX     = $F941        ;monitor; print A and X as hex
  31. CLREOP    = $FC42        ;monitor; clear from cursor down
  32. WAIT      = $FCA8        ;monitor; wait routine
  33. CROUT     = $FD8E        ;monitor; CR out
  34. PRTBYTE   = $FDDA        ;monitor; print A as hex
  35. COUT      = $FDED        ;monitor; character out routine
  36. MOVE      = $FE2C        ;monitor; MOVE
  37.  
  38. * BASIC.SYSTEM/ProDOS Equates:
  39.  
  40. EXTRNCMD  = $BE06        ;BI; external command hook
  41. ERROUT    = $BE09        ;BI; handle an error
  42. XTRNADDR  = $BE50        ;BI; external command address
  43. XLEN      = $BE52        ;BI; external cmd length-1
  44. XCNUM     = $BE53        ;BI; basic command no. (0-ext)
  45. PBITS     = $BE54        ;BI; parameter bits allowed
  46. FBITS     = $BE56        ;BI; found parameter bits
  47. VPATH1    = $BE6C        ;BI; pathname buffer
  48. GOSYSTEM  = $BE70        ;BI; execute MLI call
  49. GETBUFR   = $BEF5        ;BI; allocate buffer
  50. SSGINFO   = $BEB4        ;BI; Get/Set info parm count
  51. FIFILID   = $BEB8        ;BI; file type
  52. OSYSBUF   = $BECE        ;BI; I/O buffer
  53. OREFNUM   = $BED0        ;BI; Open ref. number
  54. RWREFNUM  = $BED6        ;BI; Read/Write ref. number
  55. RWDATA    = $BED7        ;BI; Read/Write data pointer
  56. RWCOUNT   = $BED9        ;BI; Read/Write byte count
  57. CFREFNUM  = $BEDE        ;BI; Close ref. number
  58. MACHID    = $BF98        ;ProDOS; Machine ID byte
  59.  
  60. * Applesoft Equates:
  61.  
  62. LINUM     = $1B          ;basic; line number ($1B,$1C)
  63. LINNUM    = $50          ;basic; 2-byte signed integer
  64. TOKTABL   = $D0D0        ;basic; token table
  65. LINPRT    = $ED24        ;basic; print A,X as dec
  66.  
  67.           ORG $2000      ;by convention
  68.  
  69. *===============================
  70. * Program Installation:
  71. *===============================
  72.  
  73. INSTALL   LDA #>PEND-PSTART+$100
  74.           JSR GETBUFR    ;buy space from BI
  75.           BCC GOTBUF
  76. HANDLERR  JMP ERROUT     ;handle the error
  77. GOTBUF    STA PADDR      ;save location
  78.  
  79. *===============================
  80. * Modify the code:
  81. *===============================
  82.  
  83. MODIFY    STA MANUAL+1   ;1 to change manually
  84.           LDA #<MODSTART
  85.           STA PTR        ;set program pointer
  86.           LDA #>MODSTART
  87.           STA PTR+1
  88. MODLOOP   LDY #0         ;instruction byte offset
  89.           LDA (PTR),Y    ;get opcode
  90.           JSR CHKOPLEN   ;check opcode length
  91.           LDY OPLEN      ;put length in Y
  92.           CPY #$02       ;2=3 byte instruction
  93.           BNE NOMOD      ;no modification of this one
  94.           LDA (PTR),Y    ;get HOB to fix
  95.           CMP #>MODSTART ;is it below our program
  96.           BLT NOMOD      ;yes/no modification
  97.           CMP #>MODEND+$200 ;is it above our program
  98.           BGE NOMOD      ;yes/no modification
  99. FIXIT     SEC
  100.           SBC #>PSTART   ;subtract min. location
  101.           CLC
  102.           ADC PADDR
  103.           STA (PTR),Y    ;save the byte
  104. NOMOD     TYA            ;put #bytes-1 into A
  105.           SEC            ;to add 1 more
  106.           ADC PTR        ;add #bytes-1+1 to PTR LO@@bIEsZ v"$?SKYSTA NXTCMD+1 ;copy cuurent external command
  107.           LDA EXTRNCMD+2 ;to the next command in link
  108.           STA NXTCMD+2
  109.           LDA #0
  110.           STA EXTRNCMD+1 ;put our code address in BI's
  111.           LDA PADDR      ;global page
  112.           STA EXTRNCMD+2
  113.  
  114. *===============================
  115. * Move the code:
  116. *===============================
  117.  
  118.           LDA #PSTART    ;start of final code
  119.           STA A1L
  120.           LDA #>PSTART
  121.           STA A1L+1      ;start adr. set
  122.           LDA #PEND      ;end of final code
  123.           STA A2L
  124.           LDA #>PEND
  125.           STA A2L+1      ;end adr. set
  126.           LDA #0         ;LOB of destination
  127.           STA A4L
  128.           LDA PADDR      ;HOB of destination
  129.           STA A4L+1      ;destination set
  130.           LDY #0         ;Y must contain zero
  131.           JSR MOVE       ;execute monitor move routine
  132.           CLC
  133.           RTS            ;return to BASIC
  134.  
  135.                          ;installation complete
  136.  
  137.           DS \           ;move to next page
  138.  
  139. *===============================
  140. * TYPE Command Handler:
  141. *===============================
  142.  
  143. MODSTART  = *            ;start of modified code
  144. PSTART    CLD            ;program start
  145.           LDA VPATH1
  146.           STA PTR        ;copy command pointer
  147.           LDA VPATH1+1
  148.           STA PTR+1
  149.           LDY #0
  150. CHKCMD    INY
  151.           LDA (PTR),Y    ;get command character
  152.           CMP CMDTXT,Y   ;compare to ours
  153.           BNE NOTOURS
  154.           CPY CMDTXT     ;done checking?
  155.           BLT CHKCMD
  156.  
  157. *===============================
  158. * Command is ours/send to be parsed:
  159. *===============================
  160.  
  161.           DEY
  162.           STY XLEN       ;save command length-1
  163.           LDA #0
  164.           STA XCNUM      ;mark as external command
  165.           LDA #%00000001 ;LOB of parameter bits..
  166.           STA PBITS      ;filename expected
  167.           LDA #%00000100 ;HOB of parameter bits..
  168.           STA PBITS+1    ;slot/drive optional
  169.           LDA #<TYPE
  170.           STA XTRNADDR   ;tell where to return
  171. MANUAL    LDA #$00       ;modify the HOB here
  172.           STA XTRNADDR+1
  173.           CLC            ;mark no errors
  174.           RTS            ;allow BASIC.SYSTEM to parse
  175. *
  176. NOTOURS   SEC            ;flag not our command
  177. NXTCMD    JMP $0000      ;link to next command
  178.  
  179. *===============================
  180. * The 'real' TYPE command:
  181. *===============================
  182.  
  183. TYPE      LDA #$0A       ;parm_count for GFI call
  184.           STA SSGINFO    ;save parm_count
  185.           LDA #$C4       ;GET_FILE_INFO command
  186.           JSR GOSYSTEM   ;fill GFI parameter list
  187.           BCC NOERROR    ;open file
  188. ER1       JMP ERROUT     ;let BI handle errors
  189. NOERROR   LDA HIMEM+1    ;address of all-purpose buffer
  190.           STA OSYSBUF+1
  191.           LDY #0
  192.           STY OSYSBUF    ;set open I/O buffer address
  193.           STY RWDATA     ;LOB of data buffer
  194.           STY RWCOUNT+1  ;HOB of read byte count
  195.           STY LINUM
  196.           STY LINUM+1    ;zero the line count
  197.           INY
  198.           STY RWCOUNT    ;only 1 byte read at a time
  199.           INY
  200.           STY RWDATA+1   ;data buffer at $200
  201.           LDA #$C8       ;OPEN command
  202.           JSR GOSYSTEM   ;open the file
  203.           BCS ER1        ;handle error
  204.           LDA OREFNUM
  205.           STA RWREFNUM   ;copy reference number to close
  206.           STA CFREFNUM   ;and read parameter lists
  207.  
  208. *===============================
  209. * Check file type and branch:
  210. *===============================
  211.  
  212.           JSR CROUT      ;new line
  213.           JSR CLREOP     ;clear the screen
  214.           LDA FIFILID    ;get the file type
  215.           CMP #$04       ;Txt?
  216.           BNE :1
  217.           JMP TEXT       ;handle text file
  218. :1        CMP #$1A       ;Awp?
  219.           BNE :2
  220.           JMP AWORKS     ;handle AppleWorks WP file
  221. :2        CMP #$FC       ;Bas?
  222.           BNE BINFILE    ;default to Bin type
  223.           JMP BASIC      ;handle BASIC program
  224.  
  225. *===============================
  226. * Handle BIN (or general file):
  227. *===============================
  228.  
  229. BINFILE   LDA MACHID     ;check for II+
  230.           BMI CHK80CRD
  231. DO40      LDA #8         ;use 8-byte (40-cols)
  232.           BNE SETSZ      ;always
  233. CHK80CRD  LSR
  234.           LSR            ;check bit 1
  235.           BCC DO40       ;no 80 col card to check
  236.           BIT RD80COL    ;check 80-col switch
  237.           BPL DO40       ;in 40-cols
  238.           LDA #16        ;use 16-byte (80-cols)
  239. SETSZ     STA SIZE       ;save display size
  240. BIN       JSR GETBYTE    ;check next byte
  241.           BCC GOTBYTE    ;got one
  242. TOEXIT    JMP EXIT       ;done with file
  243. GOTBYTE   PHA            ;save byte
  244.           JSR CROUT      ;new line
  245.           LDA #"$"
  246.           JSR COUT       ;print dollar sign
  247.           LDX LINUM
  248.           LDA LINUM+1    ;get current line value
  249.           JSR PRTAX      ;print the 2 bytes
  250.           LDA #"-"
  251.           JSR COUT       ;print spacer
  252.           PLA            ;restore character
  253.           LDX SIZE       ;do "size" bytes
  254.           BNE DOBYTE     ;always taken
  255. BINL1     JSR GETBYTE    ;get a byte
  256.           BCC DOBYTE     ;do the byte
  257.           LDA #" "       ;add a space char
  258.           STA INBUF,X    ;since were at EOF
  259.           LDY #3
  260.           BNE SPCS       ;do 3 spaces
  261. DOBYTE    STA INBUF,X    ;temp storage
  262.           JSR PRTBYTE    ;print the byte
  263.           LDY #1
  264. SPCS      JSR PYSPACE    ;print Y spaces
  265.           DEX
  266.           BNE BINL1      ;do a line of bytes
  267. *-------------------------------
  268. SCHAR     LDA #"|"       ;note:this is modified on
  269.           JSR COUT       ;the II+ to print a space
  270.           LDX SIZE       ;start at "size"
  271. CHRLP     LDA INBUF,X    ;get character
  272.           ORA #$80       ;set bit 7
  273.           CMP #$A0       ;is it >= spc
  274.           BGE COK        ;yes; print it
  275.           LDA #"."       ;no; substitute a period
  276. COK       JSR COUT       ;print the character
  277.           DEX
  278.           BNE CHRLP      ;do all characters
  279. *-------------------------------
  280.           JSR ANYKEY     ;user pause/exit?
  281.           BEQ TOEXIT     ;exit on esc/cntrl-c
  282.           LDA SIZE       ;add "size" bytes to line
  283.           CLC
  284.           ADC LINUM
  285.           STA LINUM
  286.           BCC BIN        ;do next line
  287.           INC LINUM+1    ;fix the HOB
  288.           JMP BIN        ;do next line
  289.  
  290. *===============================
  291. * Type TXT file:
  292. *===============================
  293.  
  294. TEXT      JSR GETBYTE    ;get a byte
  295.           BCS EXIT3      ;exit the program
  296.           ORA #$80       ;set bit 7
  297.           CMP #$A0       ;only type printable chars
  298.           BGE PRTIT
  299.           CMP #$8D       ;only allow CR/LF/FF
  300.           BEQ PRTIT
  301.           CMP #$8A       ;linefeed?
  302.           BEQ DOCR
  303.           CMP #$8C       ;form feed?
  304.           BNE TEXT       ;ignore control codes
  305. DOCR      LDA #$8D       ;convert LF/FF to CR
  306. PRTIT     JSR COUT       ;print it
  307.           JSR ANYKEY     ;check keyboard
  308.           BNE TEXT       ;always (unless esc press)
  309. EXIT3     JMP EXIT       ;exit if esc/cntrl-c press
  310.  
  311. *===============================
  312. * AppleWorks Word Proc. File (Awp):
  313. *===============================
  314.  
  315. AWORKS    LDX #$FF
  316. MORE      JSR GETBYTE    ;read in 255+45=300 bytes
  317.           DEX
  318.           BNE MORE
  319.           LDX #45        ;skip the 300 byte header
  320. MORE2     JSR GETBYTE
  321.           DEX
  322.           BNE MORE2
  323.  
  324. *===============================
  325. * Loop out AWP lines:
  326. *===============================
  327.  
  328. LINE      JSR CROUT      ;next line
  329.           JSR ANYKEY     ;check for spc/esc/cntrl-c
  330.           BEQ EXIT3      ;exit if esc/cntrl-c
  331.           JSR GETBYTE    ;get # bytes per line
  332.           BCS EXIT3      ;exit/end of file
  333.           JSR GETBYTE    ;line +001 byte (ID byte)
  334.           BNE LINE       ;ignore control lines
  335. DOTXT     JSR GETBYTE    ;get column of first character
  336.           TAY
  337.           INY            ;add 1 to it
  338. SPCLP     JSR PYSPACE    ;indent over Y spaces
  339.           JSR GETBYTE    ;get the # characters
  340.           AND #%01111111 ;isolate line length
  341.           TAX
  342. CLOOP     JSR GETBYTE    ;get line character
  343.           ORA #$80       ;set bit 7
  344.           CMP #$A0       ;cntrl code?
  345.           BLT SKPCTRL    ;skip control codes
  346.           JSR COUT       ;print characters
  347. SKPCTRL   DEX
  348.           BNE CLOOP      ;loop out characters
  349.           BEQ LINE       ;always taken
  350.  
  351. *===============================
  352. * Basic Program File (Bas):
  353. *===============================
  354.  
  355. BASIC     JSR CROUT      ;next line
  356.           JSR ANYKEY     ;check keypress
  357.           BEQ EXIT       ;exit if esc/cntrl-c
  358.           JSR GETBYTE
  359.           BCS EXIT       ;just in case an empty file
  360.           JSR GETBYTE    ;2 bytes are garbage
  361.           JSR GETBYTE
  362.           BCS EXIT
  363.           TAX            ;2 bytes are line number
  364.           JSR GETBYTE
  365.           BCS EXIT
  366.           JSR LINPRT     ;print BASIC line number..
  367.           JSR PSPACE     ;and a space
  368. BASLP     JSR GETBYTE    ;get a character
  369.           BEQ BASIC      ;end of line
  370.           BMI TOKEN      ;basic token encountered
  371. BASPRT    ORA #$80
  372.           JSR COUT       ;print the character
  373.           JMP BASLP      ;do next one on line
  374. TOKEN     AND #%01111111 ;clear bit 7
  375.           TAX            ;get commands to skip
  376.           LDA #<TOKTABL
  377.           STA PTR
  378.           LDA #>TOKTABL
  379.           STA PTR+1
  380.           JSR PSPACE     ;space before token
  381.           LDY #0
  382.           CPX #0
  383.           BEQ GTLP
  384. TKLP1     LDA (PTR),Y    ;get token character
  385.           BPL INCPTR     ;end of token
  386.           DEX
  387.           BEQ GOTTKN
  388. INCPTR    INC PTR        ;move pointer over 1
  389.           BNE TKLP1
  390.           INC PTR+1      ;fix HOB
  391.           JMP TKLP1
  392. GOTTKN    INY
  393. GTLP      LDA (PTR),Y    ;get the token
  394.           BMI LASTONE    ;print last character
  395.           ORA #$80
  396.           JSR COUT       ;print token characters
  397.           INY
  398.           BNE GTLP       ;always taken
  399. LASTONE   JSR COUT
  400.           LDA #" "
  401.           BNE BASPRT     ;always taken
  402.  
  403. *===============================
  404. * Exit the program:
  405. *===============================
  406.  
  407. EXIT      LDA #$CC       ;close command
  408.           JSR GOSYSTEM   ;close the file
  409.           JSR CROUT
  410.           CLC
  411.           RTS
  412. *-------------------------------
  413. DOERROR   PHA            ;save error code
  414.           JSR EXIT       ;close the file
  415.           PLA            ;restore error code
  416.           SEC            ;flag error
  417.           JMP ERROUT     ;exit through BI
  418.  
  419. *===============================
  420. * Subroutine GETBYTE; get file byte:
  421. *===============================
  422.  
  423. GETBYTE   LDA #$CA       ;READ command
  424.           JSR GOSYSTEM   ;execute command
  425.           BCS CHKEOF     ;could be EOF
  426.           LDA INBUF      ;get char into A..
  427.           CLC            ;flag no error..
  428.           RTS            ;and return
  429. *-------------------------------
  430. CHKEOF    CMP #5
  431.           BEQ EOF
  432.           STA OFFSET     ;temp storage
  433.           PLA
  434.           PLA            ;"pop" off subroutine
  435.           LDA OFFSET     ;restore code
  436.           JMP DOERROR    ;and handle 'real' error
  437. EOF       SEC            ;flag end of file
  438.           RTS            ;end exit
  439.  
  440. *===============================
  441. * Subroutine PSPACE/PYSPACE:
  442. *===============================
  443.  
  444. PSPACE    LDY #1         ;do 1 space
  445. PYSPACE   LDA #" "
  446. :1        JSR COUT       ;print Y spaces
  447.           DEY
  448.           BNE :1
  449.           RTS
  450.  
  451. *===============================
  452. * Subroutine ANYKEY:
  453. *===============================
  454.  
  455. ANYKEY    LDA KEYBD      ;check keyboard
  456.           BPL KEYOUT     ;no keypress
  457.           STA STROBE     ;clear keyboard
  458.           CMP #$A0       ;space?
  459.           BEQ KEY2
  460. CHKIT     CMP #$9B       ;esc?
  461.           BEQ KEYOUT
  462.           CMP #$83       ;cntrl-C
  463. KEYOUT    RTS
  464. *
  465. KEY2      LDA KEYBD      ;wait for any keypress
  466.           BPL KEY2
  467.           STA STROBE
  468.           BNE CHKIT      ;always
  469.  
  470. MODEND    = *            ;end of modification
  471.                          ;do not modify text!
  472. *===============================
  473. * Command text:
  474. *===============================
  475.  
  476. CMDTXT    STR 'TYPE'     ;our command (with length byte)
  477. *-------------------------------
  478. PEND      = *            ;end of program
  479.           LST OFF
  480.